3.1.3 原型链

当谈到继承时,JavaScript 只有一种结构:对象。
每个实例对象(object )都有一个私有属性(称之为__proto__)指向它的原型对象(prototype)。
该原型对象也有一个自己的原型对象(proto) ,层层向上直到一个对象的原型对象为 null。
根据定义,null 没有原型,并作为这个原型链中的最后一个环节。

原型链: 一张图让你秒懂原型链

性能

在原型链上查找属性比较耗时,对性能有副作用,这在性能要求苛刻的情况下很重要。另外,试图访问不存在的属性时会遍历整个原型链。

遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来。
要检查对象是否具有自己定义的属性,而不是其原型链上的某个属性,则必须使用所有对象从Object.prototype继承的 hasOwnProperty 方法。

下面给出一个具体的例子来说明它:


console.log(g.hasOwnProperty('vertices'));
// true

console.log(g.hasOwnProperty('nope'));
// false

console.log(g.hasOwnProperty('addVertex'));
// false

console.log(g.__proto__.hasOwnProperty('addVertex'));
// true

1
2
3
4
5
6
7
8
9
10
11
12
13

hasOwnProperty 是 JavaScript 中处理属性并且不会遍历原型链的方法之一。(另一种方法: Object.keys())

注意:检查属性是否undefined还不够。该属性可能存在,但其值恰好设置为undefined。

参考